<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('field_permissions', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 字段权限基本信息
            $table->string('permission_code', 100)->unique(); // 字段权限编码
            $table->string('permission_name', 200); // 字段权限名称
            $table->text('description')->nullable(); // 权限描述

            // 关联对象
            $table->string('entity_type', 50); // 实体类型：employee, user, department, etc.
            $table->string('entity_code', 100)->nullable(); // 实体编码
            $table->string('entity_name', 200)->nullable(); // 实体名称

            // 字段信息
            $table->string('table_name', 100); // 表名
            $table->string('field_name', 100); // 字段名
            $table->string('field_label', 200)->nullable(); // 字段标签
            $table->string('field_type', 50)->nullable(); // 字段类型：text, number, date, etc.

            // 权限主体
            $table->string('subject_type', 50); // role, user, department, position
            $table->unsignedBigInteger('subject_id')->nullable(); // 主体ID
            $table->string('subject_code', 100)->nullable(); // 主体编码
            $table->string('subject_name', 200)->nullable(); // 主体名称

            // 字段权限设置
            $table->boolean('allow_view')->default(false); // 允许查看
            $table->boolean('allow_edit')->default(false); // 允许编辑
            $table->boolean('allow_create')->default(false); // 允许创建时填写
            $table->boolean('is_required')->default(false); // 是否必填
            $table->boolean('is_hidden')->default(false); // 是否隐藏
            $table->boolean('is_readonly')->default(false); // 是否只读

            // 条件权限
            $table->json('view_conditions')->nullable(); // 查看条件
            $table->json('edit_conditions')->nullable(); // 编辑条件
            $table->json('required_conditions')->nullable(); // 必填条件

            // 值限制
            $table->json('value_restrictions')->nullable(); // 值域限制
            $table->string('validation_rules', 500)->nullable(); // 验证规则
            $table->json('allowed_values')->nullable(); // 允许的值列表
            $table->json('denied_values')->nullable(); // 禁止的值列表

            // 默认值设置
            $table->string('default_value', 500)->nullable(); // 默认值
            $table->boolean('use_custom_default')->default(false); // 使用自定义默认值

            // 级联控制
            $table->json('cascading_rules')->nullable(); // 级联规则
            $table->boolean('affects_other_fields')->default(false); // 影响其他字段

            // 权限层级
            $table->integer('permission_level')->default(1); // 权限级别
            $table->boolean('is_inherited')->default(false); // 是否继承
            $table->string('inheritance_source', 100)->nullable(); // 继承来源

            // 状态管理
            $table->boolean('is_active')->default(true); // 是否启用
            $table->datetime('effective_from')->nullable(); // 生效开始时间
            $table->datetime('effective_to')->nullable(); // 生效结束时间

            // 优先级和冲突解决
            $table->integer('priority')->default(1); // 优先级
            $table->string('conflict_resolution', 50)->default('highest_priority'); // highest_priority, latest, explicit_deny

            // 审计信息
            $table->json('access_log')->nullable(); // 访问日志
            $table->datetime('last_accessed')->nullable(); // 最后访问时间
            $table->integer('access_count')->default(0); // 访问次数
            $table->integer('violation_count')->default(0); // 违规次数

            // 备注和附件
            $table->text('notes')->nullable();
            $table->json('attachments')->nullable();

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['entity_type', 'entity_code'], 'fp_entity_idx');
            $table->index(['table_name', 'field_name'], 'fp_table_field_idx');
            $table->index(['subject_type', 'subject_id'], 'fp_subject_idx');
            $table->index(['permission_level'], 'fp_level_idx');
            $table->index(['is_active'], 'fp_active_idx');
            $table->index(['priority'], 'fp_priority_idx');
            $table->index(['permission_code'], 'fp_code_idx');

            // 外键约束
            $table->foreign('subject_id')->references('id')->on('users')->onDelete('set null');

            // 唯一约束：同一字段、同一主体只能有一种权限设置
            $table->unique(['field_name', 'subject_type', 'subject_id'], 'unique_field_perm');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('field_permissions');
    }
};
